const Koa = require('koa');
const cors = require('@koa/cors');
const body = require('koa-bodyparser');
const router = require('./routes/index');
const JWT = require('koa-jwt');
const { secret } = require('./config/index');

const WS = require('./config/webSocket');
new WS().create()

const app = new Koa();

// https://www.cnblogs.com/linxin/p/9491342.html
// 中间件对token进行验证
app.use(function(ctx, next) {
     // let token = ctx.header.authorization;
    // let payload = await util.promisify(jsonwebtoken.verify)(token.split(' ')[1], SECRET);
    return next().catch((err) => {
        if (401 == err.status) {
            ctx.status = 401;
            ctx.body = {
                code: 401,
                msg: err.message
            }
            // ctx.body = 'Protected resource, use Authorization header to get access\n';
        } else {
            throw err;
        }
    });
});
app.use(cors());
// 除不验证的请求
//   登录，注册接口不需要验证

// 通过 app.use 来调用该中间件，并传入密钥 {secret: 'my_token'}，
// unless 可以指定哪些 URL 不需要进行 token 验证。
// token 验证失败的时候会抛出401错误，因此需要添加错误处理，
// 而且要放在 app.use(koajwt()) 之前，否则不执行。
// 如果请求时没有token或者token过期，则会返回401。
app.use(JWT({ secret }).unless({ path: [/^\/public/, /^\/user/] }));
app.use(body());
app.use(router());
app.listen(3000);

// 用户通过登录Api获取当前用户在有效期内的token
// 需要身份验证的API则都需要携带此前认证过的token发送至服务端
// koa2会利用koa-jwt中间件的默认验证方式进行身份验证，中间件会进行验证成功和验证失败的分流。

// // koa-jwt的默认验证方式: 
// {'authorization': "Bearer " + token}